import Core from "../Core";
import { Singleton } from "../utils/Singleton";

// 定义基础配置类型
export type ConfigType = "equipCfg" | ""; //根据需求自行拓展

export class JSONManager extends Singleton<JSONManager> {
  private static _instance: JSONManager;
  private loadedConfigs: Map<string, any> = new Map();
  private constructor() {
    super();
  }
  /**
   * 异步加载并解析 JSON 配置文件
   * @param configName 配置名（如 "npcCfg"）
   * @param configClass 构造函数（用于类型转换）
   */
  public async loadConfigAsync<T>(
    configName: ConfigType,
    configClass?: { new (): T }
  ): Promise<T> {
    const key = configName;

    // 如果已缓存，直接返回
    if (this.loadedConfigs.has(key)) {
      return this.loadedConfigs.get(key) as T;
    }

    try {
      // 使用你提供的 ResHelper 加载 JSON 文件
      const jsonAsset = await Core.resHelper.load<cc.JsonAsset>(
        `${configName}`,
        cc.JsonAsset,
        "json"
      );

      if (!jsonAsset || !jsonAsset.json) {
        console.error(`Failed to load JSON file: ${configName}`);
        return null;
      }

      let result: T;

      if (configClass) {
        // 可选：进行类型映射处理（如果需要深度映射）
        result = this.mapToClass(jsonAsset.json, configClass);
      } else {
        result = jsonAsset.json as T;
      }

      this.loadedConfigs.set(key, result);
      return result;
    } catch (e) {
      console.error(`Error loading JSON ${configName}:`, e);
      return null;
    }
  }

  /**
   * 可选：将 JSON 对象映射为类实例（可进一步优化）
   */
  private mapToClass<T>(json: any, clazz: { new (): T }): T {
    const instance = new clazz();
    Object.assign(instance, json);
    return instance;
  }

  /**
   * 同步获取已加载的配置
   * @param configName 配置名
   */
  public getConfig<T>(configName: ConfigType): T {
    return this.loadedConfigs.get(configName) as T;
  }
}
